package visiopuce.service;

import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import visiopuce.ApplicationContexte;
import visiopuce.HibernateUtil;
import visiopuce.DAO.AnalyseDAOImpl;
import visiopuce.DAO.FeuillePuceDAO;
import visiopuce.DAO.FeuillePuceDAOImpl;
import visiopuce.DAO.HistoriqueDAO;
import visiopuce.DAO.HistoriqueDAOImpl;
import visiopuce.DAO.PuceDAOImpl;
import visiopuce.DAO.TypePuceDAOImpl;
import visiopuce.objets.Analyse;
import visiopuce.objets.FeuillePuce;
import visiopuce.objets.Historique;
import visiopuce.objets.Puce;
import visiopuce.objets.TypePuce;

public class FeuillePuceServiceImpl implements FeuillePuceService {

	private static final Log log = LogFactory.getLog(PrelevementService.class);

	private FeuillePuceDAO feuillePuceDAO = FeuillePuceDAOImpl.getInstance();

	private HistoriqueDAO historiqueDAO = HistoriqueDAOImpl.getInstance();;

	/** Constructeur priv� */
	private FeuillePuceServiceImpl() {
	}

	/** Instance unique non pr�initialis�e */
	private static FeuillePuceServiceImpl INSTANCE = null;

	/** Point d'acc�s pour l'instance unique du singleton */
	public static FeuillePuceService getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new FeuillePuceServiceImpl();
		}
		return INSTANCE;
	}

	@Override
	public FeuillePuce getFeuillePuceById(int idFeuille) {
		FeuillePuce u = null;
		HibernateUtil.beginTransaction();
		u = feuillePuceDAO.findByID(FeuillePuce.class, idFeuille);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return u;
	}

	@Override
	public List<FeuillePuce> getFeuillePuce() {
		List<FeuillePuce> feuilles = null;

		HibernateUtil.beginTransaction();
		feuilles = feuillePuceDAO.findAll(FeuillePuce.class);
		Collections.reverse(feuilles);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();

		return feuilles;
	}

	@Override
	public void save(FeuillePuce fp, HashMap<String, Integer> idAnalyses) {
		HibernateUtil.beginTransaction();
		try {
			feuillePuceDAO.save(fp);
			Historique h = new Historique();
			h.setDate(new Date());
			h.setRequete("save " + fp.toString());
			h.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
			historiqueDAO.save(h);

			HashMap<String, Puce> pucesDejaSurFeuille = PuceDAOImpl.getInstance().getPuceFromFeuillePuce(fp.getIdFeuillePuce());
			for(Entry<String, Puce> entry : pucesDejaSurFeuille.entrySet()) {
			    Puce puceDejaSurFeuille = entry.getValue();
				puceDejaSurFeuille.setFeuillePuce(null);
				puceDejaSurFeuille.setOrdreFeuille("");
				PuceDAOImpl.getInstance().save(puceDejaSurFeuille);

				Historique h2 = new Historique();
				h2.setDate(new Date());
				h2.setRequete("save " + puceDejaSurFeuille.toString());
				h2.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
				historiqueDAO.save(h2);

				Analyse a = AnalyseDAOImpl.getInstance().findByID(Analyse.class, puceDejaSurFeuille.getAnalyse().getIdAnalyse());
				a.setDateTechnique(null);
				a.setTechnicienne(null);
				AnalyseDAOImpl.getInstance().save(a);
				Historique h7 = new Historique();
				h7.setDate(new Date());
				h7.setRequete("save " + a.toString());
				h7.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
				historiqueDAO.save(h7);

			}

			for(Entry<String, Integer> entry : idAnalyses.entrySet()) {
				String ordre = entry.getKey();
				Integer idAnalyse = entry.getValue();
				Puce puce = null;
				Analyse a = AnalyseDAOImpl.getInstance().findByID(Analyse.class, idAnalyse);
				List<Puce> puces = PuceDAOImpl.getInstance().findAllByidAnalyse(idAnalyse);
				if (puces.size() > 0) {
					puce = puces.get(0);
				} else {
					puce = new Puce();
					puce.setAnalyse(a);
					puce.setSexePuce("I");
					puce.setSupprimer(false);
				}
				puce.setOrdreFeuille(ordre);
				puce.setFeuillePuce(fp);
				puce.setTypePuce(TypePuceDAOImpl.getInstance().findByID(TypePuce.class, fp.getIdTypePuce()));
				PuceDAOImpl.getInstance().save(puce);
				Historique h2 = new Historique();
				h2.setDate(new Date());
				h2.setRequete("save " + puce.toString());
				h2.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
				historiqueDAO.save(h2);

				a.setDateTechnique(fp.getDateEnvoi());
				a.setTechnicienne(fp.getOperateur());
				AnalyseDAOImpl.getInstance().save(a);
				Historique h3 = new Historique();
				h3.setDate(new Date());
				h3.setRequete("save " + a.toString());
				h3.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
				historiqueDAO.save(h3);

			}
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
		} finally {
			HibernateUtil.closeSession();
		}

	}

}